<!DOCTYPE html>
<html>
<head>
    

    

    



    <meta charset="utf-8">
    
    
    
    <title>Android 8.0 功能和 API | 随手记 | 不积跬步无以至千里</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    
    <meta name="theme-color" content="#1c9d5c">
    
    
    <meta name="keywords" content="Android,Android Developers,Oreo,Android 8.0">
    <meta name="description" content="用户体验 通知在 Android 8.0 中，我们已重新设计通知，以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括：-通知渠道：Android 8.0 引入了通知渠道，其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。要了解如何实现通知渠道的信息，请参阅通知渠道指南。-通知标志：Android 8.0 引入了对在应用启动器图标上显示通知标志的支持">
<meta name="keywords" content="Android,Android Developers,Oreo,Android 8.0">
<meta property="og:type" content="article">
<meta property="og:title" content="Android 8.0 功能和 API">
<meta property="og:url" content="http://yoursite.com/2017/08/29/android-8-0/index.html">
<meta property="og:site_name" content="随手记">
<meta property="og:description" content="用户体验 通知在 Android 8.0 中，我们已重新设计通知，以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括：-通知渠道：Android 8.0 引入了通知渠道，其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。要了解如何实现通知渠道的信息，请参阅通知渠道指南。-通知标志：Android 8.0 引入了对在应用启动器图标上显示通知标志的支持">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="http://yoursite.com/2017/08/29/android-8-0/notification-long-press.png">
<meta property="og:image" content="http://yoursite.com/2017/08/29/android-8-0/keyboard-navigation-clusters.png">
<meta property="og:updated_time" content="2018-04-10T01:32:54.293Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Android 8.0 功能和 API">
<meta name="twitter:description" content="用户体验 通知在 Android 8.0 中，我们已重新设计通知，以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括：-通知渠道：Android 8.0 引入了通知渠道，其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。要了解如何实现通知渠道的信息，请参阅通知渠道指南。-通知标志：Android 8.0 引入了对在应用启动器图标上显示通知标志的支持">
<meta name="twitter:image" content="http://yoursite.com/2017/08/29/android-8-0/notification-long-press.png">
    
        <link rel="alternate" type="application/atom+xml" title="随手记" href="/atom.xml">
    
    <link rel="shortcut icon" href="/favicon.ico">
    <link rel="stylesheet" href="/css/style.css?v=1.7.2">
    <script>window.lazyScripts=[]</script>

    <!-- custom head -->
    

</head>

<body>
    <div id="loading" class="active"></div>

    <aside id="menu" class="hide" >
  <div class="inner flex-row-vertical">
    <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="menu-off">
        <i class="icon icon-lg icon-close"></i>
    </a>
    <div class="brand-wrap" style="background-image:url(/img/brand.jpg)">
      <div class="brand">
        <a href="/" class="avatar waves-effect waves-circle waves-light">
          <img src="/img/avatar.jpg">
        </a>
        <hgroup class="introduce">
          <h5 class="nickname">马建</h5>
          <a href="mailto:markjoker@126.com" title="markjoker@126.com" class="mail">markjoker@126.com</a>
        </hgroup>
      </div>
    </div>
    <div class="scroll-wrap flex-col">
      <ul class="nav">
        
            <li class="waves-block waves-effect">
              <a href="/"  >
                <i class="icon icon-lg icon-home"></i>
                主页
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/archives"  >
                <i class="icon icon-lg icon-archives"></i>
                归档
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/tags"  >
                <i class="icon icon-lg icon-tags"></i>
                标签
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/categories"  >
                <i class="icon icon-lg icon-th-list"></i>
                分类
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="https://github.com/markjoker" target="_blank" >
                <i class="icon icon-lg icon-github"></i>
                Github
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="http://www.weibo.com/markjoker" target="_blank" >
                <i class="icon icon-lg icon-weibo"></i>
                微博
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/cv"  >
                <i class="icon icon-lg icon-file"></i>
                简历
              </a>
            </li>
        
      </ul>
    </div>
  </div>
</aside>

    <main id="main">
        <header class="top-header" id="header">
    <div class="flex-row">
        <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light on" id="menu-toggle">
          <i class="icon icon-lg icon-navicon"></i>
        </a>
        <div class="flex-col header-title ellipsis">Android 8.0 功能和 API</div>
        
        <div class="search-wrap" id="search-wrap">
            <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="back">
                <i class="icon icon-lg icon-chevron-left"></i>
            </a>
            <input type="text" id="key" class="search-input" autocomplete="off" placeholder="输入感兴趣的关键字">
            <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="search">
                <i class="icon icon-lg icon-search"></i>
            </a>
        </div>
        
        
        <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="menuShare">
            <i class="icon icon-lg icon-share-alt"></i>
        </a>
        
    </div>
</header>
<header class="content-header post-header">

    <div class="container fade-scale">
        <h1 class="title">Android 8.0 功能和 API</h1>
        <h5 class="subtitle">
            
                <time datetime="2017-08-29T11:47:18.000Z" itemprop="datePublished" class="page-time">
  2017-08-29
</time>


            
        </h5>
    </div>

    


</header>


<div class="container body-wrap">
    
    <aside class="post-widget">
        <nav class="post-toc-wrap post-toc-shrink" id="post-toc">
            <h4>目录</h4>
            <ol class="post-toc"><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#用户体验"><span class="post-toc-number">1.</span> <span class="post-toc-text">用户体验</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#通知"><span class="post-toc-number">1.1.</span> <span class="post-toc-text">通知</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#自动填充框架"><span class="post-toc-number">1.2.</span> <span class="post-toc-text">自动填充框架</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#画中画模式"><span class="post-toc-number">1.3.</span> <span class="post-toc-text">画中画模式</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#API-变更"><span class="post-toc-number">1.4.</span> <span class="post-toc-text">API 变更</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#可下载字体"><span class="post-toc-number">1.5.</span> <span class="post-toc-text">可下载字体</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#XML-中的字体"><span class="post-toc-number">1.6.</span> <span class="post-toc-text">XML 中的字体</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#自动调整-TextView-的大小"><span class="post-toc-number">1.7.</span> <span class="post-toc-text">自动调整 TextView 的大小</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#自适应图标"><span class="post-toc-number">1.8.</span> <span class="post-toc-text">自适应图标</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#颜色管理"><span class="post-toc-number">1.9.</span> <span class="post-toc-text">颜色管理</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#WebView-API"><span class="post-toc-number">1.10.</span> <span class="post-toc-text">WebView API</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#固定快捷方式和小部件"><span class="post-toc-number">1.11.</span> <span class="post-toc-text">固定快捷方式和小部件</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#多显示器支持"><span class="post-toc-number">1.12.</span> <span class="post-toc-text">多显示器支持</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#统一的布局外边距和内边距"><span class="post-toc-number">1.13.</span> <span class="post-toc-text">统一的布局外边距和内边距</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#指针捕获"><span class="post-toc-number">1.14.</span> <span class="post-toc-text">指针捕获</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#应用类别"><span class="post-toc-number">1.15.</span> <span class="post-toc-text">应用类别</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#Android-TV-启动器"><span class="post-toc-number">1.16.</span> <span class="post-toc-text">Android TV 启动器</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#AnimatorSet"><span class="post-toc-number">1.17.</span> <span class="post-toc-text">AnimatorSet</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#输入和导航"><span class="post-toc-number">1.18.</span> <span class="post-toc-text">输入和导航</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#键盘导航键区"><span class="post-toc-number">1.18.1.</span> <span class="post-toc-text">键盘导航键区</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#视图默认焦点"><span class="post-toc-number">1.18.2.</span> <span class="post-toc-text">视图默认焦点</span></a></li></ol></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#系统"><span class="post-toc-number">2.</span> <span class="post-toc-text">系统</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#新的-StrictMode-检测程序"><span class="post-toc-number">2.1.</span> <span class="post-toc-text">新的 StrictMode 检测程序</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#缓存数据"><span class="post-toc-number">2.2.</span> <span class="post-toc-text">缓存数据</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#内容提供程序分页"><span class="post-toc-number">2.3.</span> <span class="post-toc-text">内容提供程序分页</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#内容刷新请求"><span class="post-toc-number">2.4.</span> <span class="post-toc-text">内容刷新请求</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#JobScheduler-改进"><span class="post-toc-number">2.5.</span> <span class="post-toc-text">JobScheduler 改进</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#自定义数据存储"><span class="post-toc-number">2.6.</span> <span class="post-toc-text">自定义数据存储</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#findViewById-签名变更"><span class="post-toc-number">2.7.</span> <span class="post-toc-text">findViewById() 签名变更</span></a></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#媒体增强功能"><span class="post-toc-number">3.</span> <span class="post-toc-text">媒体增强功能</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#自定义文档提供程序"><span class="post-toc-number">3.0.1.</span> <span class="post-toc-text">自定义文档提供程序</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#直接文档访问"><span class="post-toc-number">3.0.2.</span> <span class="post-toc-text">直接文档访问</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#文档路径"><span class="post-toc-number">3.0.3.</span> <span class="post-toc-text">文档路径</span></a></li></ol></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#连接"><span class="post-toc-number">4.</span> <span class="post-toc-text">连接</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#WLAN-感知"><span class="post-toc-number">4.1.</span> <span class="post-toc-text">WLAN 感知</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#蓝牙"><span class="post-toc-number">4.2.</span> <span class="post-toc-text">蓝牙</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#配套设备配对"><span class="post-toc-number">4.3.</span> <span class="post-toc-text">配套设备配对</span></a></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#共享"><span class="post-toc-number">5.</span> <span class="post-toc-text">共享</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#智能共享"><span class="post-toc-number">5.1.</span> <span class="post-toc-text">智能共享</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#智能文本选择"><span class="post-toc-number">5.2.</span> <span class="post-toc-text">智能文本选择</span></a></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#无障碍功能"><span class="post-toc-number">6.</span> <span class="post-toc-text">无障碍功能</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#无障碍功能按钮"><span class="post-toc-number">6.1.</span> <span class="post-toc-text">无障碍功能按钮</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#独立的音量调整"><span class="post-toc-number">6.2.</span> <span class="post-toc-text">独立的音量调整</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#指纹手势"><span class="post-toc-number">6.3.</span> <span class="post-toc-text">指纹手势</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#字词级突出显示"><span class="post-toc-number">6.4.</span> <span class="post-toc-text">字词级突出显示</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#标准化单端范围值"><span class="post-toc-number">6.5.</span> <span class="post-toc-text">标准化单端范围值</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#提示文本"><span class="post-toc-number">6.6.</span> <span class="post-toc-text">提示文本</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#连续的手势分派"><span class="post-toc-number">6.7.</span> <span class="post-toc-text">连续的手势分派</span></a></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#安全性与隐私"><span class="post-toc-number">7.</span> <span class="post-toc-text">安全性与隐私</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#权限"><span class="post-toc-number">7.1.</span> <span class="post-toc-text">权限</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#API-变更-1"><span class="post-toc-number">7.1.1.</span> <span class="post-toc-text">API 变更</span></a></li></ol></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#测试"><span class="post-toc-number">8.</span> <span class="post-toc-text">测试</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#仪器测试"><span class="post-toc-number">8.1.</span> <span class="post-toc-text">仪器测试</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#针对非默认应用进程运行"><span class="post-toc-number">8.1.1.</span> <span class="post-toc-text">针对非默认应用进程运行</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#在测试过程中报告结果"><span class="post-toc-number">8.1.2.</span> <span class="post-toc-text">在测试过程中报告结果</span></a></li></ol></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#用于测试的模拟-Intent"><span class="post-toc-number">8.2.</span> <span class="post-toc-text">用于测试的模拟 Intent</span></a></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#运行时和工具"><span class="post-toc-number">9.</span> <span class="post-toc-text">运行时和工具</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#平台优化"><span class="post-toc-number">9.1.</span> <span class="post-toc-text">平台优化</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#更新的-Java-支持"><span class="post-toc-number">9.2.</span> <span class="post-toc-text">更新的 Java 支持</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#更新的-ICU4J-Android-Framework-API"><span class="post-toc-number">9.3.</span> <span class="post-toc-text">更新的 ICU4J Android Framework API</span></a></li></ol></li><li class="post-toc-item post-toc-level-1"><a class="post-toc-link" href="#Android-企业版"><span class="post-toc-number">10.</span> <span class="post-toc-text">Android 企业版</span></a></li></ol>
        </nav>
    </aside>


<article id="post-android-8-0"
  class="post-article article-type-post fade" itemprop="blogPost">

    <div class="post-card">
        <h1 class="post-card-title">Android 8.0 功能和 API</h1>
        <div class="post-meta">
            <time class="post-time" title="2017-08-29 19:47:18" datetime="2017-08-29T11:47:18.000Z"  itemprop="datePublished">2017-08-29</time>

            


            
<span id="busuanzi_container_page_pv" title="文章总阅读量" style='display:none'>
    <i class="icon icon-eye icon-pr"></i><span id="busuanzi_value_page_pv"></span>
</span>


        </div>
        <div class="post-content" id="post-content" itemprop="postContent">
            <h1 id="用户体验"><a href="#用户体验" class="headerlink" title="用户体验"></a>用户体验</h1><hr>
<h2 id="通知"><a href="#通知" class="headerlink" title="通知"></a>通知</h2><p><img src="/2017/08/29/android-8-0/notification-long-press.png" alt="Drawing" style="width: 200px;float:right"><br>在 Android 8.0 中，我们已重新设计通知，以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括：<br>-<strong>通知渠道</strong>：Android 8.0 引入了通知渠道，其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。要了解如何实现通知渠道的信息，请参阅<a href="https://developer.android.com/preview/features/notification-channels.html" target="_blank" rel="noopener">通知渠道</a>指南。<br>-<strong>通知标志</strong>：Android 8.0 引入了对在应用启动器图标上显示通知标志的支持。通知标志可反映某个应用是否存在与其关联、并且用户尚未予以清除也未对其采取行动的通知。通知标志也称为通知点。要了解如何调整通知标志，请参阅<a href="https://developer.android.com/preview/features/notification-badges.html" target="_blank" rel="noopener">通知标志</a>指南。<br>-<strong>休眠</strong>：用户可以将通知置于休眠状态，以便稍后重新显示它。重新显示时通知的重要程度与首次显示时相同。应用可以移除或更新已休眠的通知，但更新休眠的通知并不会使其重新显示。<br>-<strong>通知超时</strong>：现在，使用 <code>setTimeoutAfter()</code>创建通知时您可以设置超时。您可以使用此函数指定一个持续时间，超过该持续时间后，通知应取消。如果需要，您可以在指定的超时持续时间之前取消通知。<br>-<strong>通知设置</strong>：当您使用 <code>Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCESIntent</code> 从通知创建指向应用通知设置的链接时，您可以调用 <code>setSettingsText()</code> 来设置要显示的文本。此系统可以提供以下 <code>Extra</code> 数据和 <code>Intent</code>，用于过滤应用必须向用户显示的设置：<code>EXTRA_CHANNEL_ID</code>、<code>NOTIFICATION_TAG 和 NOTIFICATION_ID</code>。<br>-<strong>通知清除</strong>：系统现在可区分通知是由用户清除，还是由应用移除。要查看清除通知的方式，您应实现 <code>NotificationListenerService</code> 类的新 <code>onNotificationRemoved()</code> 函数。<br>-<strong>背景颜色</strong>：您现在可以设置和启用通知的背景颜色。只能在用户必须一眼就能看到的持续任务的通知中使用此功能。例如，您可以为与驾车路线或正在进行的通话有关的通知设置背景颜色。您还可以使用 <code>Notification.Builder.setColor()</code> 设置所需的背景颜色。这样做将允许您使用 <code>Notification.Builder.setColorized()</code> 启用通知的背景颜色设置。<br>-<strong>消息样式</strong>：现在，使用 <code>MessagingStyle</code> 类的通知可在其折叠形式中显示更多内容。对于与消息有关的通知，您应使用 <code>MessagingStyle</code> 类。您还可以使用新的 <code>addHistoricMessage()</code> 函数，通过向与消息相关的通知添加历史消息为会话提供上下文。</p>
<h2 id="自动填充框架"><a href="#自动填充框架" class="headerlink" title="自动填充框架"></a>自动填充框架</h2><p>帐号创建、登录和信用卡交易需要时间并且容易出错。在使用要求执行此类重复性任务的应用时，用户很容易遭受挫折。<br>Android 8.0 通过引入自动填充框架，简化了登录和信用卡表单之类表单的填写工作。在用户选择接受自动填充之后，新老应用都可使用自动填充框架。<br>您可以采取某些措施，优化您的应用使用此框架的方式。如需了解详细信息，请参阅<a href="https://developer.android.com/preview/features/autofill.html" target="_blank" rel="noopener">自动填充框架概览</a>。</p>
<h2 id="画中画模式"><a href="#画中画模式" class="headerlink" title="画中画模式"></a>画中画模式</h2><p>Android 8.0 允许以画中画 (PIP) 模式启动操作组件。PIP 是一种特殊的多窗口模式，最常用于视频播放。目前，PIP 模式可用于 Android TV，而 Android 8.0 则让该功能可进一步用于其他 Android 设备。<br>当某个 Activity 处于 PIP 模式时，它会处于暂停状态，但仍应继续显示内容。因此，您应确保您的应用在 <code>onPause()</code> 处理程序中进行处理时不会暂停播放。相反，您应在 onStop() 中暂停播放视频，并在 <code>onStart()</code> 中继续播放。如需了解详细信息，请参阅<a href="https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle" target="_blank" rel="noopener">多窗口生命周期</a>。<br>要指定您的 Activity 可以使用 PIP 模式，请在清单中将 android:supportsPictureInPicture 设置为 true。（从 Android 8.0 开始，如果您打算在 Android TV 或其他 Android 设备上支持 PIP 模式，则无需将 android:resizeableActivity 设置为 true；只有在您的 Activity 支持其他多窗口模式时，才需要设置 android:resizeableActivity。）</p>
<h2 id="API-变更"><a href="#API-变更" class="headerlink" title="API 变更"></a>API 变更</h2><p>Android 8.0 引入一种新的对象 PictureInPictureParams，您可以将该对象传递给 PIP 函数来指定某个 Activity 在其处于 PIP 模式时的行为。此对象还指定了各种属性，例如操作组件的首选纵横比。</p>
<p>现在，在添加画中画中介绍的现有 PIP 函数可用于所有 Android 设备，而不仅限于 Android TV。此外，Android 8.0 还提供以下函数来支持 PIP 模式：</p>
<ul>
<li><p><strong>Activity.enterPictureInPictureMode(PictureInPictureParams args)</strong>：将操作组件置于画中画模式。操作组件的纵横比和其他配置设置均由 <code>args</code> 指定。如果 <code>args</code> 中的任何字段为空，系统将使用您上次调用 <code>Activity.setPictureInPictureParams()</code> 时所设置的值。<br>指定的操作组件被置于屏幕的一角，屏幕剩余部分则被屏幕显示的上一个操作组件填满。进入 PIP 模式的 Activity 将进入暂停状态，但仍保持已启动状态。如果用户点按此 PIP 操作组件，系统将显示一个菜单供用户操作，而在操作组件处于 PIP 状态期间，不会理会任何触摸事件。</p>
</li>
<li><p><strong>Activity.setPictureInPictureParams()</strong>：更新操作组件的 PIP 配置设置。如果操作组件目前处于 PIP 模式，则会更新此设置；如果操作组件的纵横比发生变化，这非常有用。如果操作组件不处于 PIP 模式，则会使用这些配置设置，而不会考虑您调用的 <code>enterPictureInPictureMode()</code> 函数。</p>
</li>
</ul>
<h2 id="可下载字体"><a href="#可下载字体" class="headerlink" title="可下载字体"></a>可下载字体</h2><p>Android 8.0 和 Android 支持库 26 允许您从提供程序应用请求字体，而无需将字体绑定到 APK 中或让 APK 下载字体。此功能可减小 APK 大小，提高应用安装成功率，使多个应用可以共享同一种字体。</p>
<p>如需了解有关下载字体的详细信息，请参阅 <a href="https://developer.android.com/preview/features/downloadable-fonts.html" target="_blank" rel="noopener">可下载字体</a>。</p>
<h2 id="XML-中的字体"><a href="#XML-中的字体" class="headerlink" title="XML 中的字体"></a>XML 中的字体</h2><p>Android 8.0 推出一项新功能，即 XML 中的字体，允许您使用字体作为资源。这意味着，不再需要以资产的形式捆绑字体。字体在 R 文件中编译，并且作为一种资源，可自动用于系统。然后，您可以利用一种新的资源类型 font 来访问这些字体。</p>
<p>在运行 API 版本 14 及更高版本的设备中，支持库 26 对此功能提供完全支持。</p>
<p>如需了解有关以资源形式使用字体以及检索系统字体有关的详细信息，请参阅 <a href="https://developer.android.com/preview/features/fonts-in-xml.html" target="_blank" rel="noopener">XML 中的字体</a>。</p>
<h2 id="自动调整-TextView-的大小"><a href="#自动调整-TextView-的大小" class="headerlink" title="自动调整 TextView 的大小"></a>自动调整 TextView 的大小</h2><p>Android 8.0 允许您根据 TextView 的大小自动设置文本展开或收缩的大小。这意味着，在不同屏幕上优化文本大小或者优化包含动态内容的文本大小比以往简单多了。如需了解有关如何在 Android 8.0 中自动调整 TextView 的大小的详细信息，请参阅<a href="https://developer.android.com/preview/features/autosizing-textview.html" target="_blank" rel="noopener">自动调整 TextView 的大小</a>。</p>
<h2 id="自适应图标"><a href="#自适应图标" class="headerlink" title="自适应图标"></a>自适应图标</h2><p>Android 8.0 引入自适应启动器图标。自适应图标支持视觉效果，可在不同设备型号上显示为各种不同的形状。要了解如何创建自适应图标，请参阅<a href="https://developer.android.com/preview/features/adaptive-icons.html" target="_blank" rel="noopener">自适应图标预览功能指南</a>。</p>
<h2 id="颜色管理"><a href="#颜色管理" class="headerlink" title="颜色管理"></a>颜色管理</h2><p>图像应用的 Android 开发者现在可以利用支持广色域彩色显示的新设备。要显示广色域图像，应用需要在其清单（每个操作组件）中启用一个标志，并加载具有嵌入的广域彩色配置文件（AdobeRGB、Pro Photo RGB、DCI-P3 等）的位图。</p>
<h2 id="WebView-API"><a href="#WebView-API" class="headerlink" title="WebView API"></a>WebView API</h2><p>Android 8.0 提供多种 API，帮助您管理在应用中显示网页内容的 <code>WebView</code> 对象。这些 API 可增强应用的稳定性和安全性，它们包括：</p>
<ul>
<li>Version API</li>
<li>Google SafeBrowsing API</li>
<li>Termination Handle API</li>
<li>Renderer Importance API<br>要详细了解如何这些 API，请参阅<a href="https://developer.android.com/preview/features/managing-webview.html" target="_blank" rel="noopener">管理 WebView</a>。</li>
</ul>
<h2 id="固定快捷方式和小部件"><a href="#固定快捷方式和小部件" class="headerlink" title="固定快捷方式和小部件"></a>固定快捷方式和小部件</h2><p>Android 8.0 引入了快捷方式和微件的应用内固定功能。在您的应用中，您可以根据用户权限为支持的启动器创建固定的快捷方式和小部件。</p>
<p>如需了解详细信息，请参阅<a href="https://developer.android.com/preview/features/pinning-shortcuts-widgets.html" target="_blank" rel="noopener">固定快捷方式和微件</a>预览功能指南。</p>
<p>##最大屏幕纵横比<br>以 Android 7.1（API 级别 25）或更低版本为目标平台的应用默认的最大屏幕纵横比为 1.86。针对 Android 8.0 或更高版本的应用没有默认的最大纵横比。如果您的应用需要设置最大纵横比，请使用定义您的操作组件的清单文件中的 <code>maxAspectRatio</code> 属性。</p>
<h2 id="多显示器支持"><a href="#多显示器支持" class="headerlink" title="多显示器支持"></a>多显示器支持</h2><p>从 Android 8.0 开始，此平台为多显示器提供增强的支持。如果 Activity 支持多窗口模式，并且在具有多显示器的设备上运行，则用户可以将 Activity 从一个显示器移动到另一个显示器。当应用启动 Activity 时，此应用可指定 Activity 应在哪个显示器上运行。</p>
<blockquote>
<p><strong>注</strong>：如果 Activity 支持多窗口模式，则 Android 8.0 将为该 Activity 自动启用多显示器支持。您应测试您的应用，确保它在多显示器环境下可正常运行。<br>每次只有一个 Activity 可以处于继续状态，即使此应用具有多个显示器。具有焦点的 Activity 将处于继续状态，所有其他可见的 Activity 均暂停，但不会停止。如需了解有关当多个 Activity 可见时活动生命周期的详细信息，请参阅<a href="https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle" target="_blank" rel="noopener">多窗口生命周期</a>。</p>
</blockquote>
<p>当用户将 Activity 从一个显示器移动到另一个显示器时，系统将调整 Activity 大小，并根据需要发起运行时变更。您的 Activity 可以自行处理配置变更，或允许系统销毁包含该 Activity 的进程，并以新的尺寸重新创建它。如需了解详细信息，请参阅<a href="https://developer.android.com/guide/topics/resources/runtime-changes.html" target="_blank" rel="noopener">处理配置变更</a>。<br><strong>setLaunchDisplayId()</strong><br>&emsp;&emsp;指定 Activity 在启动后应显示在哪个显示器上。<br><strong>getLaunchDisplayId()</strong><br>&emsp;&emsp;返回操作组件的当前启动显示器。<br>对 adb shell 进行了扩展，以支持多个显示器。shell start 命令现在可用于启动操作组件，并指定操作组件的目标显示器：<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell start &lt;activity_name&gt; --display &lt;display_id&gt;</span><br></pre></td></tr></table></figure></p>
<h2 id="统一的布局外边距和内边距"><a href="#统一的布局外边距和内边距" class="headerlink" title="统一的布局外边距和内边距"></a>统一的布局外边距和内边距</h2><p>Android 8.0 让您可以更轻松地指定 View 元素的对边使用相同外边距和内边距的情形。具体来说，您现在可以在布局 XML 文件中使用以下属性：<br>-<strong>layout_marginVertical</strong>，同时定义 <code>layout_marginTop</code> 和 <code>layout_marginBottom</code>。<br>-<strong>layout_marginHorizontal</strong>，同时定义 <code>layout_marginLeft</code> 和 <code>layout_marginRight</code>。<br>-<strong>paddingVertical</strong>，同时定义 <code>paddingTop</code> 和 <code>paddingBottom</code>。<br>-<strong>paddingHorizontal</strong>，同时定义 <code>paddingLeft</code> 和 <code>paddingRight</code>。</p>
<blockquote>
<p><strong>注</strong>：如果您自定义应用逻辑以支持不同语言和文化（包括文本方向），请记住，这些属性不会影响 <code>layout_marginStart</code>、<code>layout_marginEnd</code>、<code>paddingStart</code> 或 <code>paddingEnd</code> 的值。您可以自行设置这些值和新的垂直与水平布局属性来创建取决于文本方向的布局行为。</p>
</blockquote>
<h2 id="指针捕获"><a href="#指针捕获" class="headerlink" title="指针捕获"></a>指针捕获</h2><p>某些应用（例如游戏、远程桌面和虚拟化客户端）将大大受益于鼠标指针控制。指针捕获是 Android 8.0 中的一项新功能，可以通过将所有鼠标事件传递到您的应用中焦点视图的方式提供此类控制。</p>
<p>从 Android 8.0 开始，您的应用中的 View 可以请求指针捕获并定义一个侦听器来处理捕获的指针事件。鼠标指针在此模式下将隐藏。如果不再需要鼠标信息，该视图可以释放指针捕获。系统也可以在视图丢失焦点时（例如，当用户打开另一个应用时）释放指针捕获。</p>
<p>如需了解有关如何在您的应用中使用此功能的信息，请参<a href="https://developer.android.com/preview/features/pointer-capture.html" target="_blank" rel="noopener">阅指针捕获</a>。</p>
<h2 id="应用类别"><a href="#应用类别" class="headerlink" title="应用类别"></a>应用类别</h2><p>在适当的情况下，Android 8.0 允许每个应用声明其所属的类别。这些类别用于将应用呈现给用户的用途或功能类似的应用归类在一起，例如按流量消耗、电池消耗和存储消耗将应用归类。您可以在 <application> 清单标记中设置 android:appCategory 属性，定义应用的类别。</application></p>
<h2 id="Android-TV-启动器"><a href="#Android-TV-启动器" class="headerlink" title="Android TV 启动器"></a>Android TV 启动器</h2><p>Android 8.0 添加了一种以内容为中心的全新 Android TV 主屏幕体验，支持 Android TV 模拟器和 Nexus Player Android 8.0 设备映像。新的主屏幕在对应于频道的行中组织视频内容，这些频道在系统上通过应用填充各个节目。应用可以发布多个频道，用户可以配置他们希望在主屏幕上看到哪些频道。Android TV 也包含一个 Watch Next 行，此行根据用户的观看习惯从应用填充节目。应用也可以提供视频预览，这些预览会在用户聚焦到节目时自动播放。用于填充频道和节目的 API 属于 TvProvider API，这些 API 以 Android 支持库模块的形式随 Android 8.0 分发。</p>
<h2 id="AnimatorSet"><a href="#AnimatorSet" class="headerlink" title="AnimatorSet"></a>AnimatorSet</h2><p>从 Android 8.0 开始，AnimatorSet API 现在支持寻道和倒播功能。寻道功能允许您将动画的位置设置为指定的时间点处。如果您的应用包含可撤消的操作的动画，倒播功能会很有用。现在，您不必定义两组独立的动画，而只需反向播放同一组动画。</p>
<h2 id="输入和导航"><a href="#输入和导航" class="headerlink" title="输入和导航"></a>输入和导航</h2><h3 id="键盘导航键区"><a href="#键盘导航键区" class="headerlink" title="键盘导航键区"></a>键盘导航键区</h3><p>如果您的应用中，某个操作组件使用一种复杂的视图层次结构，可考虑将多组界面元素组成一个键区，简化键盘导航这些元素的操作。用户可以在 Chromebook 设备上按 Meta+Tab 或 Search+Tab，在不同键区之间导航。键区的一些范例包括：侧面板、导航栏、主内容区域和可能包含多个子元素的元素。<br><figure class="image-bubble">
                <div class="img-lightbox">
                    <div class="overlay"></div>
                    <img src="/2017/08/29/android-8-0/keyboard-navigation-clusters.png" alt="包含 5 个键区的操作组件" title="">
                </div>
                <div class="image-caption">包含 5 个键区的操作组件</div>
            </figure><br>要将一个 <code>View</code> 或 <code>ViewGroup</code> 元素设置为一个键区，请在元素的布局 XML 文件中将 <code>android:keyboardNavigationCluster</code> 属性设置为 true，或者将 true 传递至应用界面逻辑中的 <code>setKeyboardNavigationCluster()</code>。</p>
<blockquote>
<p><strong>注</strong>：键区不能嵌套，不过，非嵌套键区可以显示在层次结构的不同层级。如果您尝试嵌套键区，框架仅会将最顶层的 ViewGroup 元素视为键区。</p>
</blockquote>
<p>在具有触摸屏的设备中，您可以将某个键区指定的 ViewGroup 对象的 <code>android:touchscreenBlocksFocus</code> 元素设置为 true，仅允许从键区导航进入和离开此键区。如果您将此配置应用于某个键区，用户将无法使用 Tab 键或箭头键导航进入或离开此键区，而是必须按键区导航键盘组合键</p>
<h3 id="视图默认焦点"><a href="#视图默认焦点" class="headerlink" title="视图默认焦点"></a>视图默认焦点</h3><p>在 Android 8.0 中，您可以指定在（重新）创建的操作组件继续运行并且用户按下键盘导航键（例如 Tab 键）之后应接收焦点的 View。要应用“设为默认焦点”设置，请在包含界面元素的布局 XML 文件中将 View 元素的 <code>android:focusedByDefault</code> 属性设置为 true，或者将 true 传递至应用界面逻辑中的 <code>setFocusedByDefault()</code>。</p>
<h1 id="系统"><a href="#系统" class="headerlink" title="系统"></a>系统</h1><hr>
<h2 id="新的-StrictMode-检测程序"><a href="#新的-StrictMode-检测程序" class="headerlink" title="新的 StrictMode 检测程序"></a>新的 StrictMode 检测程序</h2><p>Android 8.0 添加了三个新的 StrictMode 检测程序，帮助识别应用可能出现的错误：</p>
<ul>
<li><code>detectUnbufferedIo()</code> 将检测您的应用何时读取或写入未缓冲的数据，这可能极大影响性能。</li>
<li><code>detectContentUriWithoutPermission()</code> 将检测您的应用在其外部启动 Activity 时何时意外忘记向其他应用授予权限。</li>
<li><code>detectUntaggedSockets()</code> 将检测您的应用何时使用网络流量，而不使用 setThreadStatsTag(int) 将流量标记用于调试目的。</li>
</ul>
<h2 id="缓存数据"><a href="#缓存数据" class="headerlink" title="缓存数据"></a>缓存数据</h2><p>Android 8.0 优化了缓存数据的导航和行为。现在，每个应用均获得一定的磁盘空间配额，用于存储 <code>getCacheQuotaBytes(UUID)</code> 返回的缓存数据。</p>
<p>当系统需要释放磁盘空间时，将开始从超过配额最多的应用中删除缓存文件。因此，如果将您的缓存数据量始终保持低于配额的水平，则在必须清除系统中的某些文件时，您的缓存文件将能坚持到最后。系统在决定删除您的应用中的哪些缓存文件时，将首先考虑删除最旧的文件（由修改时间确定）。</p>
<p>您还可以针对每个目录启用两种新行为，以控制系统如何释放缓存数据：</p>
<ul>
<li><strong>StorageManager.setCacheBehaviorAtomic()</strong> 可用于指示某个目录及其所有内容应作为一个不可分割的整体进行删除。</li>
<li><strong>setCacheBehaviorTombstone(File, boolean)</strong> 可用于指示不应删除某个目录内的文件，而应将它们截断到 0 字节长度，使空文件保持完好。</li>
</ul>
<p>最后，在需要为大文件分配磁盘空间时，可考虑使用新的 <code>allocateBytes(FileDescriptor, long)</code> API，它将自动清除属于其他应用的缓存文件（根据需要），以满足您的请求。在确定设备是否有足够的磁盘空间保存您的新数据时，请调用 <code>getAllocatableBytes(UUID)</code> 而不要使用 <code>getUsableSpace()</code>，因为前者会考虑系统要为您清除的任何缓存数据。</p>
<h2 id="内容提供程序分页"><a href="#内容提供程序分页" class="headerlink" title="内容提供程序分页"></a>内容提供程序分页</h2><p>我们已更新内容提供程序以支持加载大型数据集，每次加载一页。例如，一个具有大量图像的照片应用可查询要在页面中显示的数据的子集。内容提供程序返回的每个结果页面由一个 Cursor 对象表示。客户端和提供程序必须实现分页才能利用此功能。</p>
<p>如需了解有关内容提供程序变更的详细信息，请参阅<a href="https://developer.android.com/reference/android/content/ContentProvider.html" target="_blank" rel="noopener">ContentProvider</a>和<a href="https://developer.android.com/reference/android/content/ContentProviderClient.html" target="_blank" rel="noopener">ContentProviderClient</a>。</p>
<h2 id="内容刷新请求"><a href="#内容刷新请求" class="headerlink" title="内容刷新请求"></a>内容刷新请求</h2><p>现在，<strong>ContentProvider</strong> 和 <strong>ContentResolver</strong> 类均包含 <code>refresh()</code> 函数，这样，客户端可以更轻松地知道所请求的信息是否为最新信息。</p>
<p>您可以扩展 <strong>ContentProvider</strong> 以添加自定义的内容刷新逻辑。请务必重写 <code>refresh()</code>函数，以返回 true，告知提供程序的客户端您已尝试自行刷新数据。</p>
<p>您的客户端应用可通过调用另一个函数（又称 refresh()），显式请求已刷新的内容。在调用此函数时，传入待刷新数据的 URI。</p>
<blockquote>
<p><strong>注：</strong>由于您可能通过网络不断请求数据，您应仅在有明显迹象表明内容确已过时时才从客户端调用 refresh()。执行此类内容刷新最常见的原因是响应滑动刷新手势，该手势显式请求当前界面显示最新内容。</p>
</blockquote>
<h2 id="JobScheduler-改进"><a href="#JobScheduler-改进" class="headerlink" title="JobScheduler 改进"></a>JobScheduler 改进</h2><p>Android 8.0 引入了对 <strong>JobScheduler</strong> 的多项改进。由于您通常可以使用计划作业替代现在受限的后台服务或隐式广播接收器，这些改进可以让您的应用更轻松地符合新的后台执行限制。</p>
<p><strong>JobScheduler</strong> 的更新包括：</p>
<ul>
<li>您现在可以将工作队列与计划作业关联。要将一个工作项添加到作业的队列中，请调用 JobScheduler.enqueue()。当作业运行时，它可以将待定工作从队列中剥离并进行处理。这种功能可以处理之前需要启动后台服务（尤其是实现 IntentService 的服务）的许多用例。</li>
<li>您现在可以通过调用 JobInfo.Builder.setClipData() 的方式将 ClipData 与作业关联。利用此选项，您可以将 URI 权限授予与作业关联，类似于这些权限传递到 Context.startService() 的方式。您也可以将 URI 权限授予用于工作队列上的 intent。</li>
<li>计划作业现在支持多个新的约束条件：<br><code>JobInfo.isRequireStorageNotLow()</code><br>&emsp;&emsp;如果设备的可用存储空间非常低，作业将不会运行。<br><code>JobInfo.isRequireBatteryNotLow()</code><br>&emsp;&emsp;如果电池电量等于或低于临界阈值，作业将不会运行；临界阈值是指设备显示 Low battery warning 系统对话框的电量。<br><code>NETWORK_TYPE_METERED</code><br>&emsp;&emsp;作业需要一个按流量计费的网络连接，比如大多数移动数据网络数据套餐。</li>
</ul>
<h2 id="自定义数据存储"><a href="#自定义数据存储" class="headerlink" title="自定义数据存储"></a>自定义数据存储</h2><p>Android 8.0 允许您为首选项提供自定义数据存储，如果您的应用将首选项存储在云或本地数据库中，或者如果首选项特定于某个设备，此功能会非常有用。如需了解有关实现数据存储的详细信息，请参阅<a href="https://developer.android.com/preview/features/custom-data-store.html" target="_blank" rel="noopener">自定义数据存储</a>。</p>
<h2 id="findViewById-签名变更"><a href="#findViewById-签名变更" class="headerlink" title="findViewById() 签名变更"></a>findViewById() 签名变更</h2><p>现在，findViewById() 函数的全部实例均返回 <code>&lt;T extends View&gt;</code> T，而不是 View。此变更会带来以下影响：</p>
<ul>
<li>例如，如果 <code>someMethod(View)</code> 和 <code>someMethod(TextView)</code> 均接受调用 <code>findViewById()</code> 的结果，这可能导致现有代码的返回类型不确定。</li>
<li>在使用 Java 8 源语言时，这需要在返回类型不受限制时（例如，<code>assertNotNull(findViewById(...)).someViewMethod())</code>）显式转换为 View。</li>
<li>重写非最终的 <code>findViewById()</code> 函数（例如，Activity.findViewById()）将需要更新其返回类型。</li>
</ul>
<h1 id="媒体增强功能"><a href="#媒体增强功能" class="headerlink" title="媒体增强功能"></a>媒体增强功能</h1><hr>
<p><a href="https://developer.android.com/guide/topics/providers/document-provider.html" target="_blank" rel="noopener">存储访问框架 (SAF)</a> 允许应用显示自定义 <strong>DocumentsProvider</strong>，后者可以为其他应用提供访问数据源中的文件的权限。事实上，文档提供程序甚至可以提供驻留在网络存储区或使用<a href="https://en.wikipedia.org/wiki/Media_Transfer_Protocol" target="_blank" rel="noopener">媒体传输协议 (MTP) </a>等协议的文件的访问权限。</p>
<p>但是，访问远程数据源中的大媒体文件面临一些挑战：</p>
<ul>
<li>媒体播放器需要以寻址方式访问来自文档提供程序的文件。当大媒体文件驻留在远程数据源上时，文档提供程序必须事先提取所有数据，并创建快照文件描述符。媒体播放器无法播放没有文件描述符的文件，因此在文档提供程序完成文件下载前，无法开始播放。</li>
<li>照片应用等媒体集合管理器必须通过作用域文件夹遍历一系列访问 URI 才能访问存储在外部 SD 卡上的媒体。这种访问模式会让媒体上的批量操作（例如移动、复制和删除）变得非常缓慢。</li>
<li>媒体集合管理器无法根据文档的 URI 确定其位置。这就让这些类型的应用难以允许用户选择媒体文件的保存位置。<br>Android 8.0 通过改进存储访问框架解决了各个挑战。</li>
</ul>
<h3 id="自定义文档提供程序"><a href="#自定义文档提供程序" class="headerlink" title="自定义文档提供程序"></a>自定义文档提供程序</h3><p>从 Android 8.0 开始，存储访问框架允许自定义<a href="https://developer.android.com/guide/topics/providers/create-document-provider.html" target="_blank" rel="noopener">文档提供程序</a>为驻留在远程数据源中的文件创建可寻址的文件描述符。SAF 可打开文件，获取原生可寻址的文件描述符。然后 SAF 向文档提供程序提交离散字节请求。此功能使文档提供程序可以返回媒体播放器应用请求的准确字节范围，而不必事先缓存整个文件。</p>
<p>要使用此功能，您需要调用新的 <code>StorageManager.openProxyFileDescriptor()</code> 函数。<code>openProxyFileDescriptor()</code> 函数可接受 <strong>ProxyFileDescriptorCallback</strong> 对象作为回调。任何时候，当客户端应用对文档提供程序返回的文件描述符执行文件操作时，SAF 都会调用回调。</p>
<h3 id="直接文档访问"><a href="#直接文档访问" class="headerlink" title="直接文档访问"></a>直接文档访问</h3><p>从 Android 8.0 开始，您可以使用 <code>getDocumentUri()</code> 函数获得与给定 mediaUri 引用相同文档的 URI。不过，由于返回的 URI 由 <strong>DocumentsProvider</strong> 提供支持，媒体集合管理器可以直接访问文档，不用遍历作用域目录树。因此，媒体管理器能够以明显加快的速度对文档执行文件操作。</p>
<blockquote>
<p><strong>注意：</strong><code>getDocumentUri()</code> 函数仅可以定位媒体文件；无法授予应用访问这些文件的权限。要详细了解如何获取媒体文件的访问权限，请参阅参考文档。</p>
</blockquote>
<h3 id="文档路径"><a href="#文档路径" class="headerlink" title="文档路径"></a>文档路径</h3><p>在 Android 8.0 中使用存储访问框架时，您可以根据文档的 ID，使用 <code>findDocumentPath()</code> 函数（存在于 <strong>DocumentsContract</strong> 和 <strong>DocumentsProvider</strong> 类中）从文件系统的根目录中确定路径。该函数将在 DocumentsContract.Path 对象中返回此路径。如果文件系统对相同文档有多个定义的路径，该函数将返回访问具有给定 ID 的文档时最常使用的路径。</p>
<p>此功能在下列情况下特别有用：</p>
<ul>
<li>您的应用使用可以显示特定文档位置的“另存为”对话框。</li>
<li>您的应用在搜索结果视图中显示文件夹并且如果用户选择某个文件夹，应用必须加载此特定文件夹内的子文档。<blockquote>
<p><strong>注：</strong>如果您的应用仅具有路径中某些文档的访问权限，那么 <code>findDocumentPath()</code> 的返回值将仅包含您的应用可以访问的文件夹和文档。</p>
</blockquote>
</li>
</ul>
<h1 id="连接"><a href="#连接" class="headerlink" title="连接"></a>连接</h1><hr>
<h2 id="WLAN-感知"><a href="#WLAN-感知" class="headerlink" title="WLAN 感知"></a>WLAN 感知</h2><p>Android 8.0 新增了对 WLAN 感知的支持，此技术基于周边感知联网 (NAN) 规范。在具有相应 WLAN 感知硬件的设备上，应用和附近设备可以通过 WLAN 进行搜索和通信，无需依赖互联网接入点。我们正在与硬件合作伙伴合作，以尽快将 WLAN 感知技术应用于设备。要了解有关如何将 WLAN 感知集成到您的应用中的信息，请参阅 <a href="https://developer.android.com/preview/features/wifi-aware.html" target="_blank" rel="noopener">WLAN 感知</a>。</p>
<h2 id="蓝牙"><a href="#蓝牙" class="headerlink" title="蓝牙"></a>蓝牙</h2><p>Android 8.0 通过增加以下功能，增强了平台对蓝牙的支持：</p>
<ul>
<li>支持 AVRCP 1.4 标准，该标准支持音乐库浏览。</li>
<li>支持蓝牙低功耗 (BLE) 5.0 标准。</li>
<li>将 Sony LDAC 编解码器集成到蓝牙堆叠中。</li>
</ul>
<h2 id="配套设备配对"><a href="#配套设备配对" class="headerlink" title="配套设备配对"></a>配套设备配对</h2><p>在尝试通过蓝牙、BLE 和 WLAN 与配套设备配对时，Android 8.0 提供的 API 允许您自定义配对请求对话框。如需了解详细信息，请参阅<a href="https://developer.android.com/preview/features/companion-device-pairing.html" target="_blank" rel="noopener">配套设备配对</a>。</p>
<p>如需了解有关在 Android 上使用<a href="https://developer.android.com/guide/topics/connectivity/bluetooth.html" target="_blank" rel="noopener">蓝牙</a>的详细信息，请参阅蓝牙指南。有关对蓝牙所作的特定于 Android 8.0 的变更，请参阅 <a href="https://developer.android.com/preview/behavior-changes.html" target="_blank" rel="noopener">Android 8.0 行为变更</a>页面的<a href="https://developer.android.com/preview/behavior-changes.html#bt" target="_blank" rel="noopener">蓝牙</a>部分。</p>
<h1 id="共享"><a href="#共享" class="headerlink" title="共享"></a>共享</h1><hr>
<h2 id="智能共享"><a href="#智能共享" class="headerlink" title="智能共享"></a>智能共享</h2><p>Android 8.0 了解用户的个性化分享首选项，在通过哪些应用分享各个类型的内容方面，也有着更好的把握。例如，如果用户为一张收据拍照，Android 8.0 可以建议费用跟踪应用；如果用户自拍，一款社交媒体应用可以更好地处理图像。Android 8.0 可以根据用户的个性化首选项自动学习所有这些模式。</p>
<p>智能分享适用于 image 之外的内容类型，例如 <strong>audio</strong>、<strong>video</strong>、<strong>text</strong> 和 <strong>URL</strong> 等。</p>
<p>要启用智能分享，请将具有最多三个字符串注释的 <strong>ArrayList</strong> 添加到分享内容的 intent。这些注释应说明内容中的主要部分或主题。下面的代码示例显示了如何向 intent 添加注释：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">ArrayList&lt;String&gt; annotations = <span class="keyword">new</span> ArrayList&lt;&gt;();</span><br><span class="line"></span><br><span class="line">annotations.add(<span class="string">"topic1"</span>);</span><br><span class="line">annotations.add(<span class="string">"topic2"</span>);</span><br><span class="line">annotations.add(<span class="string">"topic3"</span>);</span><br><span class="line"></span><br><span class="line">intent.putStringArrayListExtra(</span><br><span class="line">    Intent.EXTRA_CONTENT_ANNOTATIONS,</span><br><span class="line">    annotations</span><br><span class="line">);</span><br></pre></td></tr></table></figure></p>
<p>如需了解有关智能分享注释的详细信息，请参阅 <code>EXTRA_CONTENT_ANNOTATIONS</code>。</p>
<h2 id="智能文本选择"><a href="#智能文本选择" class="headerlink" title="智能文本选择"></a>智能文本选择</h2><p>在兼容设备上，Android 8.0 让应用可以帮助用户以更有意义的方式与文本交互。当用户长按某个实体中可识别格式的单词（例如某个地址或餐馆名称）时，系统会选中整个实体。用户会看到一个浮动工具栏，该工具栏包含可以处理所选文本实体的应用。例如，如果系统识别出某个地址，它可以将用户导向地图应用。</p>
<p>系统识别的实体包括地址、网址、电话号码和电子邮件地址。如需了解详细信息，请参阅 <strong>TextClassifier</strong>。</p>
<h1 id="无障碍功能"><a href="#无障碍功能" class="headerlink" title="无障碍功能"></a>无障碍功能</h1><hr>
<p>Android 8.0 支持开发者使用以下无障碍功能创建自己的无障碍服务。如需了解有关如何让您的应用更便于访问的更多信息，请参阅<a href="https://developer.android.com/guide/topics/ui/accessibility/index.html" target="_blank" rel="noopener">无障碍功能</a>。</p>
<h2 id="无障碍功能按钮"><a href="#无障碍功能按钮" class="headerlink" title="无障碍功能按钮"></a>无障碍功能按钮</h2><p>您的无障碍服务现在可以请求在系统的导航区域显示无障碍功能按钮，该按钮让用户可从其设备上的任意位置快速激活您的服务功能。要执行此操作，请在某个 <strong>AccessibilityServiceInfo</strong> 对象的 <strong>android:accessibilityFlags</strong> 属性中添加 <strong>FLAG_REQUEST_ACCESSIBILITY_BUTTON</strong> 标志。稍后，您可以使用 <code>registerAccessibilityButtonCallback()</code> 注册回调。</p>
<blockquote>
<p><strong>注：</strong>此功能仅适用于提供软件渲染导航区域的设备。请始终使用 <code>isAccessibilityButtonAvailable()</code>，并通过实现 <code>onAvailabilityChanged()</code> 根据无障碍功能按钮的可用性来响应变更。通过该方式，用户可以始终访问您的服务功能，即使该无障碍功能按钮不受支持或变得不可用。</p>
</blockquote>
<h2 id="独立的音量调整"><a href="#独立的音量调整" class="headerlink" title="独立的音量调整"></a>独立的音量调整</h2><p>Android 8.0 引入了 <strong>STREAM_ACCESSIBILITY</strong> 音量类别，允许您单独控制无障碍服务音频输出的音量，而不会影响设备上的其他声音。</p>
<p>要使用这个新的流类型来控制无障碍服务音量，请在无障碍服务中设置 <strong>FLAG_ENABLE_ACCESSIBILITY_VOLUME</strong> 选项。然后，您可以使用 <code>adjustStreamVolume()</code> 更改设备的无障碍服务音频音量。</p>
<h2 id="指纹手势"><a href="#指纹手势" class="headerlink" title="指纹手势"></a>指纹手势</h2><p>您的无障碍服务也可以响应替代的输入机制，即沿设备的指纹传感器按特定方向滑动（上、下、左和右）。要接收有关这些交互的回调，请完成以下一系列步骤：</p>
<ol>
<li>声明 <strong>USE_FINGERPRINT </strong>权限和 <strong>CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES</strong> 功能。</li>
<li>在 <strong>android:accessibilityFlags</strong> 属性中设置 <strong>FLAG_REQUEST_FINGERPRINT_GESTURES</strong> 标志。</li>
<li>使用 <code>registerFingerprintGestureCallback()</code> 注册回调。</li>
</ol>
<p>请记住，并非所有设备都包含指纹传感器。您可以使用 <code>isHardwareDetected()</code> 函数识别设备是否支持此传感器。即使对于包含指纹传感器的设备，您的服务也只有在指纹传感器不用于身份验证目的时才可使用它。要识别此传感器何时可用，请调用 <code>isGestureDetectionAvailable()</code> 函数并实现 <code>onGestureDetectionAvailabilityChanged()</code> 回调。</p>
<h2 id="字词级突出显示"><a href="#字词级突出显示" class="headerlink" title="字词级突出显示"></a>字词级突出显示</h2><p>要确定 <strong>TextView</strong> 对象中可见字符的位置，您可以在 <strong>EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY</strong> 中将其作为第一个参数传递到 <code>refreshWithExtraData()</code> 中。随后会更新您为 <code>refreshWithExtraData()</code> 提供的作为第二个参数的 <strong>Bundle</strong> 对象，使之包含一个可打包的 <strong>Rect</strong> 对象数组。每个 <strong>Rect</strong> 对象代表某个特定字符的边界框。</p>
<p>如果您的服务使用 <strong>TextToSpeech</strong> 对象朗读屏幕上出现的内容，您可以获取有关文本到语音转换引擎何时开始朗读单个合成字词时的准确时间信息，前提是文本到语音转换引擎提供此信息。当引擎即将开始播放特定范围文本的音频时，Text-to-Speech API 会通知您的服务，将使用 <code>onRangeStart()</code> 函数开始朗读此范围的文本。</p>
<p>如果您创建自己的 <strong>TextToSpeechService</strong> 实现，您可以使用 <code>rangeStart()</code> 函数支持这一新功能。</p>
<h2 id="标准化单端范围值"><a href="#标准化单端范围值" class="headerlink" title="标准化单端范围值"></a>标准化单端范围值</h2><p><strong>AccessibilityNodeInfo</strong> 的一些实例使用 <code>AccessibilityNodeInfo.RangeInfo</code> 的某个实例来表明界面元素可接受一定范围的值。使用 <code>RangeInfo.obtain()</code> 创建范围或使用 <code>getMin()</code> 和 <code>getMax()</code> 检索此范围的极值时，请注意，Android 8.0 规定了标准化单端范围：</p>
<ul>
<li>对于没有最小值的范围，<strong>Float.NEGATIVE_INFINITY</strong> 表示最小值。</li>
<li>对于没有最大值的范围，<strong>Float.POSITIVE_INFINITY</strong> 表示最大值。</li>
</ul>
<h2 id="提示文本"><a href="#提示文本" class="headerlink" title="提示文本"></a>提示文本</h2><p>Android 8.0 包含可用于与文本可编辑对象的提示文本进行交互的多个函数：</p>
<ul>
<li><code>isShowingHintText()</code> 和 <code>setShowingHintText()</code> 函数分别显示和设置节点的当前文本内容是否表示节点的提示文本。如果节点不包含可编辑文本，则它不应包含提示文本。</li>
<li>要访问提示文本本身，请使用 <code>getHintText()</code>。即使某个对象当前未显示提示文本，系统也能成功调用 <code>getHintText()</code>。</li>
</ul>
<h2 id="连续的手势分派"><a href="#连续的手势分派" class="headerlink" title="连续的手势分派"></a>连续的手势分派</h2><p>您的服务现在可以使用 <code>GestureDescription.StrokeDescription</code> 构造函数中的最后一个参数 <strong>willContinue</strong>，指定属于同一设定手势的笔划的顺序。</p>
<h1 id="安全性与隐私"><a href="#安全性与隐私" class="headerlink" title="安全性与隐私"></a>安全性与隐私</h1><hr>
<h2 id="权限"><a href="#权限" class="headerlink" title="权限"></a>权限</h2><p>Android 8.0 引入了多个与电话有关的新权限：</p>
<ul>
<li><strong>ANSWER_PHONE_CALLS</strong> 允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话，您可以使用 <code>acceptRingingCall()</code> 函数。</li>
<li><strong>READ_PHONE_NUMBERS</strong> 权限允许您的应用读取设备中存储的电话号码。<br>这些权限均被划分为<strong>危险</strong>类别，属于 <strong>PHONE</strong> 权限组。</li>
</ul>
<p>##新的帐号访问和 Discovery API<br>Android 8.0 对应用访问用户帐号的方式引入多项改进。对于由身份验证器管理的帐号，身份验证器在决定对应用隐藏帐号还是显示帐号时可以使用自己的策略。Android 系统跟踪可以访问特定帐号的应用。</p>
<p>在以前的 Android 版本中，想要跟踪用户帐号列表的应用必须获取有关所有帐号的更新，包括具有不相关类型的帐号。Android 8.0 添加了 addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) 函数，其允许应用指定应接收帐号变更的帐号类型列表。</p>
<h3 id="API-变更-1"><a href="#API-变更-1" class="headerlink" title="API 变更"></a>API 变更</h3><p>AccountManager 提供六个新函数以帮助身份验证器管理哪些应用可以查看某个帐号：</p>
<ul>
<li><code>setAccountVisibility(android.accounts.Account, java.lang.String, int)</code>：针对特定用户帐号和软件包组合设置可见性级别。</li>
<li><code>getAccountVisibility(android.accounts.Account, java.lang.String)</code>：获取特定用户帐号和软件包组合的可见性级别。</li>
<li><code>getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)</code>：允许身份验证器获取帐号和给定软件包的可见性级别。</li>
<li><code>getPackagesAndVisibilityForAccount(android.accounts.Account)</code>：允许身份验证器获取存储的给定帐号的可见性值。</li>
<li><code>addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map&lt;java.lang.String, java.lang.Integer&gt;)</code>：允许身份验证器初始化帐号的可见性值。</li>
<li><code>addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])</code>：将 <strong>OnAccountsUpdateListener</strong> 侦听器添加到 <strong>AccountManager</strong> 对象。无论设备上的帐号列表何时发生变化，系统都将调用此侦听器。</li>
</ul>
<p>Android 8.0 引入两个特殊的软件包名称值，以使用 <code>setAccountVisibility(android.accounts.Account, java.lang.String, int)</code> 函数指定未设置的应用的可见性级别。<strong>PACKAGE_NAME_KEY_LEGACY_VISIBLE</strong> 可见性值应用于具有 <strong>GET_ACCOUNTS</strong> 权限的应用，并且其目标 Android 版本低于 Android 8.0，或其签名与针对任意 Android 版本的身份验证器匹配。<strong>PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE</strong> 为之前未设置的应用提供默认的可见性值，对于此类应用，<strong>PACKAGE_NAME_KEY_LEGACY_VISIBLE</strong> 不适用。</p>
<p>如需了解有关新的帐号访问和发现 API 的详细信息，请参阅 <strong>AccountManager</strong> 和 <strong>OnAccountsUpdateListener</strong> 参考。</p>
<p>##Google Safe Browsing API<br>WebView 类现在添加了一个 Safe Browsing API 来增强网络浏览的安全性。如需了解详细信息，请参阅 <a href="https://developer.android.com/preview/features/managing-webview.html#safe-browsing" target="_blank" rel="noopener">Google Safe Browsing API</a>。</p>
<h1 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h1><h2 id="仪器测试"><a href="#仪器测试" class="headerlink" title="仪器测试"></a>仪器测试</h2><p>Android 8.0 为应用的仪器测试提供以下几项额外支持。</p>
<h3 id="针对非默认应用进程运行"><a href="#针对非默认应用进程运行" class="headerlink" title="针对非默认应用进程运行"></a>针对非默认应用进程运行</h3><p>现在，您可以指定针对您的应用的默认进程以外的进程运行特定仪器测试。如果您的应用包含多个在不同进程中运行的操作组件，此配置非常有用。</p>
<p>要定义非默认进程仪器测试，请导航至您的清单文件，然后导航至所需的 <code>&lt;instrumentation&gt;</code> 元素。添加 <code>android:targetProcess</code> 属性，并将它的值设置为以下值之一：</p>
<ul>
<li>特定进程的名称。</li>
<li>以逗号分隔的进程名称列表。</li>
<li>通配符（”*”），允许针对任何执行 <strong>android:targetPackage</strong> 属性中指定的软件包中的代码的已启动进程运行仪器测试。<br>在执行仪器测试时，您可以通过调用 <code>getProcessName()</code> 检查正在测试哪个进程。</li>
</ul>
<h3 id="在测试过程中报告结果"><a href="#在测试过程中报告结果" class="headerlink" title="在测试过程中报告结果"></a>在测试过程中报告结果</h3><p>现在，通过调用 <code>addResults()</code>，您可以在执行仪器测试时（而不用等到测试后）报告结果。</p>
<h2 id="用于测试的模拟-Intent"><a href="#用于测试的模拟-Intent" class="headerlink" title="用于测试的模拟 Intent"></a>用于测试的模拟 Intent</h2><p>为了更轻松地为您应用的操作组件创建隔离、独立的界面测试，Android 8.0 引入了 <code>onStartActivity()</code> 函数。要处理您的测试类调用的特定 intent，您可以在 <code>nstrumentation.ActivityMonitor</code> 类的自定义子类中替换此函数。</p>
<p>当您的测试类调用 intent 时，该函数将返回一个存根 <code>Instrumentation.ActivityResult</code> 对象，而不是执行 intent 本身。通过在您的测试中使用这种模拟 intent 逻辑，您可以侧重于自己的操作组件如何准备和处理您传递到不同操作组件或完全不同的应用中的 intent。</p>
<h1 id="运行时和工具"><a href="#运行时和工具" class="headerlink" title="运行时和工具"></a>运行时和工具</h1><hr>
<h2 id="平台优化"><a href="#平台优化" class="headerlink" title="平台优化"></a>平台优化</h2><p>Android 8.0 为平台引入了运行时优化和其他优化，这些优化将带来多项性能改进。这些优化包括并发压缩垃圾回收、更有效的内存利用和代码区域。</p>
<p>它们可以加快启动时间，并为 OS 和应用带来更好的性能。</p>
<h2 id="更新的-Java-支持"><a href="#更新的-Java-支持" class="headerlink" title="更新的 Java 支持"></a>更新的 Java 支持</h2><p>Android 8.0 添加了对更多 OpenJDK Java API 的支持：</p>
<ul>
<li>OpenJDK 8 中的 java.time。</li>
<li>OpenJDK 7 中的 java.nio.file 和 java.lang.invoke。<br>要详细了解这些新添加的软件包中的类和函数，请参阅 API 参考文档。</li>
</ul>
<p>如果您想要在 Android Studio 中使用 <a href="https://developer.android.com/studio/preview/features/java8-support.html" target="_blank" rel="noopener">Java 8 语言功能</a>，您应下载最新的预览版本。</p>
<h2 id="更新的-ICU4J-Android-Framework-API"><a href="#更新的-ICU4J-Android-Framework-API" class="headerlink" title="更新的 ICU4J Android Framework API"></a>更新的 ICU4J Android Framework API</h2><p>Android 8.0 扩展了 ICU4J Android 框架 API—，它是 ICU4J API 的子集—，供应用开发者在 android.icu 软件包中使用。这些 API 使用设备上具有的本地化数据。因此，您无需在 APK 中编译 ICU4J 库，从而减少 APK 占用空间。</p>
<h1 id="Android-企业版"><a href="#Android-企业版" class="headerlink" title="Android 企业版"></a>Android 企业版</h1><hr>
<p>已为运行 Android 8.0 的设备引入新的企业功能和 API。重要功能包括如下：</p>
<ul>
<li>完全托管的设备中的工作资料使企业可以在管理工作数据与个人数据的同时，将它们分离开来。</li>
<li>API 委派允许设备所有者和个人资料所有者将应用管理分配给其他应用。</li>
<li>配置流程中的用户体验改进措施（包含新的自定义选项）缩短了设置时间。</li>
<li>蓝牙、WLAN、备份和安全性方面的新增控制选项使企业可以更精细地管理设备。网络操作组件日志记录可帮助企业追查问题。</li>
</ul>
<p>如需详细了解上述及其他新增 Android 企业版 API 和功能，请参阅<a href="https://developer.android.com/preview/features/work.html" target="_blank" rel="noopener">企业中的 Android</a>。</p>

        </div>

        <blockquote class="post-copyright">
    
    <div class="content">
        
<span class="post-time">
    最后更新时间：<time datetime="2018-04-10T01:32:54.293Z" itemprop="dateUpdated">2018-04-10 09:32:54</time>
</span><br>


        
        如有错误，请留言指正。
        
    </div>
    
    <footer>
        <a href="http://yoursite.com">
            <img src="/img/avatar.jpg" alt="马建">
            马建
        </a>
    </footer>
</blockquote>

        
<div class="page-reward">
    <a id="rewardBtn" href="javascript:;" class="page-reward-btn waves-effect waves-circle waves-light">赏</a>
</div>



        <div class="post-footer">
            
	<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Android/">Android</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Android-8-0/">Android 8.0</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Android-Developers/">Android Developers</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Oreo/">Oreo</a></li></ul>


            
<div class="page-share-wrap">
    

<div class="page-share" id="pageShare">
    <ul class="reset share-icons">
      <li>
        <a class="weibo share-sns" target="_blank" href="http://service.weibo.com/share/share.php?url=http://yoursite.com/2017/08/29/android-8-0/&title=《Android 8.0 功能和 API》 — 随手记&pic=http://yoursite.com/img/avatar.jpg" data-title="微博">
          <i class="icon icon-weibo"></i>
        </a>
      </li>
      <li>
        <a class="weixin share-sns wxFab" href="javascript:;" data-title="微信">
          <i class="icon icon-weixin"></i>
        </a>
      </li>
      <li>
        <a class="qq share-sns" target="_blank" href="http://connect.qq.com/widget/shareqq/index.html?url=http://yoursite.com/2017/08/29/android-8-0/&title=《Android 8.0 功能和 API》 — 随手记&source=desc" data-title=" QQ">
          <i class="icon icon-qq"></i>
        </a>
      </li>
      <li>
        <a class="facebook share-sns" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=http://yoursite.com/2017/08/29/android-8-0/" data-title=" Facebook">
          <i class="icon icon-facebook"></i>
        </a>
      </li>
      <li>
        <a class="twitter share-sns" target="_blank" href="https://twitter.com/intent/tweet?text=《Android 8.0 功能和 API》 — 随手记&url=http://yoursite.com/2017/08/29/android-8-0/&via=http://yoursite.com" data-title=" Twitter">
          <i class="icon icon-twitter"></i>
        </a>
      </li>
      <li>
        <a class="google share-sns" target="_blank" href="https://plus.google.com/share?url=http://yoursite.com/2017/08/29/android-8-0/" data-title=" Google+">
          <i class="icon icon-google-plus"></i>
        </a>
      </li>
    </ul>
 </div>



    <a href="javascript:;" id="shareFab" class="page-share-fab waves-effect waves-circle">
        <i class="icon icon-share-alt icon-lg"></i>
    </a>
</div>



        </div>
    </div>

    
<nav class="post-nav flex-row flex-justify-between">
  
    <div class="waves-block waves-effect prev">
      <a href="/2017/09/10/architecture-guide/" id="post-prev" class="post-nav-link">
        <div class="tips"><i class="icon icon-angle-left icon-lg icon-pr"></i> Prev</div>
        <h4 class="title">Android架构组件(一)-指导</h4>
      </a>
    </div>
  

  
    <div class="waves-block waves-effect next">
      <a href="/2017/01/10/android-7-0-changes/" id="post-next" class="post-nav-link">
        <div class="tips">Next <i class="icon icon-angle-right icon-lg icon-pl"></i></div>
        <h4 class="title">Android 7.0 行为变更</h4>
      </a>
    </div>
  
</nav>



    














</article>

<div id="reward" class="page-modal reward-lay">
    <a class="close" href="javascript:;"><i class="icon icon-close"></i></a>
    <h3 class="reward-title">
        <i class="icon icon-quote-left"></i>
        谢谢大爷~
        <i class="icon icon-quote-right"></i>
    </h3>
    <div class="reward-content">
        
        <div class="reward-code">
            <img id="rewardCode" src="/img/wechat.jpg" alt="打赏二维码">
        </div>
        
        <label class="reward-toggle">
            <input id="rewardToggle" type="checkbox" class="reward-toggle-check"
                data-wechat="/img/wechat.jpg" data-alipay="/img/alipay.jpg">
            <div class="reward-toggle-ctrol">
                <span class="reward-toggle-item wechat">微信</span>
                <span class="reward-toggle-label"></span>
                <span class="reward-toggle-item alipay">支付宝</span>
            </div>
        </label>
        
    </div>
</div>



</div>

        <footer class="footer">
    <div class="top">
        
<p>
    <span id="busuanzi_container_site_uv" style='display:none'>
        站点总访客数：<span id="busuanzi_value_site_uv"></span>
    </span>
    <span id="busuanzi_container_site_pv" style='display:none'>
        站点总访问量：<span id="busuanzi_value_site_pv"></span>
    </span>
</p>


        <p>
            
                <span><a href="/atom.xml" target="_blank" class="rss" title="rss"><i class="icon icon-lg icon-rss"></i></a></span>
            
            <span>博客内容遵循 <a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议</a></span>
        </p>
    </div>
    <div class="bottom">
        <p><span>马建 &copy; 2015 - 2019</span>
            <span>
                
            </span>
        </p>
    </div>
</footer>

    </main>
    <div class="mask" id="mask"></div>
<a href="javascript:;" id="gotop" class="waves-effect waves-circle waves-light"><span class="icon icon-lg icon-chevron-up"></span></a>



<div class="global-share" id="globalShare">
    <ul class="reset share-icons">
      <li>
        <a class="weibo share-sns" target="_blank" href="http://service.weibo.com/share/share.php?url=http://yoursite.com/2017/08/29/android-8-0/&title=《Android 8.0 功能和 API》 — 随手记&pic=http://yoursite.com/img/avatar.jpg" data-title="微博">
          <i class="icon icon-weibo"></i>
        </a>
      </li>
      <li>
        <a class="weixin share-sns wxFab" href="javascript:;" data-title="微信">
          <i class="icon icon-weixin"></i>
        </a>
      </li>
      <li>
        <a class="qq share-sns" target="_blank" href="http://connect.qq.com/widget/shareqq/index.html?url=http://yoursite.com/2017/08/29/android-8-0/&title=《Android 8.0 功能和 API》 — 随手记&source=desc" data-title=" QQ">
          <i class="icon icon-qq"></i>
        </a>
      </li>
      <li>
        <a class="facebook share-sns" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=http://yoursite.com/2017/08/29/android-8-0/" data-title=" Facebook">
          <i class="icon icon-facebook"></i>
        </a>
      </li>
      <li>
        <a class="twitter share-sns" target="_blank" href="https://twitter.com/intent/tweet?text=《Android 8.0 功能和 API》 — 随手记&url=http://yoursite.com/2017/08/29/android-8-0/&via=http://yoursite.com" data-title=" Twitter">
          <i class="icon icon-twitter"></i>
        </a>
      </li>
      <li>
        <a class="google share-sns" target="_blank" href="https://plus.google.com/share?url=http://yoursite.com/2017/08/29/android-8-0/" data-title=" Google+">
          <i class="icon icon-google-plus"></i>
        </a>
      </li>
    </ul>
 </div>


<div class="page-modal wx-share" id="wxShare">
    <a class="close" href="javascript:;"><i class="icon icon-close"></i></a>
    <p>扫一扫，分享到微信</p>
    <img src="" alt="微信分享二维码">
</div>




    <script src="//cdn.bootcss.com/node-waves/0.7.4/waves.min.js"></script>
<script>
var BLOG = { ROOT: '/', SHARE: true, REWARD: true };


</script>

<script src="/js/main.min.js?v=1.7.2"></script>


<div class="search-panel" id="search-panel">
    <ul class="search-result" id="search-result"></ul>
</div>
<template id="search-tpl">
<li class="item">
    <a href="{path}" class="waves-block waves-effect">
        <div class="title ellipsis" title="{title}">{title}</div>
        <div class="flex-row flex-middle">
            <div class="tags ellipsis">
                {tags}
            </div>
            <time class="flex-col time">{date}</time>
        </div>
    </a>
</li>
</template>

<script src="/js/search.min.js?v=1.7.2" async></script>






<script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>



<script>
(function() {
    var OriginTitile = document.title, titleTime;
    document.addEventListener('visibilitychange', function() {
        if (document.hidden) {
            document.title = '随手记';
            clearTimeout(titleTime);
        } else {
            document.title = '随手记';
            titleTime = setTimeout(function() {
                document.title = OriginTitile;
            },2000);
        }
    });
})();
</script>



</body>
</html>
